package finalapp.exercise.activities;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import finalapp.exercise.db.LocationsDB.Places;
import finalapp.exercise.R;

/**
 * Clase que mostrara el listado de localizaciones
 * 
 * @author Alejandro Villamarin
 *
 */
public class ListaLugaresActivity extends ListActivity {
    
	/**
	 * Variable que usaremos para identificar el tipo de menu a mostrar
	 */
	private static final int DIALOG_ABOUT = 0;	
	
	/**
	 * Metodo que se llama al crearse la activity 
	 */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.locationsactivity);
        //cargamos la lista con localizaciones
        configurarAdapter();
    }
    
    /**
	 * Metodo que se llama cuando la activity entra en modo pause
	 */
   	@Override
    public void onResume() {
    	super.onResume();
    }
   	
   	/**
	 * Metodo que se llama cuando la activity entra en modo stop
	 */
   	@Override
   	protected void onStop() {
   		super.onStop();
   	}
   	
   	/**
	 * Metodo que se crea el menu asociado a la activity
	 *
	 * @param	menu	El objeto menu a introducir en el UI
	 * @return	TRUE si el menu se ha creado correctamente
	 */
   	@Override
   	public boolean onCreateOptionsMenu(Menu menu) {
   		MenuInflater inflater = getMenuInflater();
   		inflater.inflate(R.menu.menu_listado, menu);
   		return true;
   	}
   	
   	/**
	 * Metodo que se llama cuando se selecciona una opcion en el menu
	 * 
	 * @param	item	La opcion del menu seleccionada
	 */
   	@Override
   	public boolean onOptionsItemSelected(MenuItem item) {
   		//Mostramos un dialogo con info o salimos de la aplicacion
   		switch(item.getItemId()) {
   			case R.id.menuAcercaDe:
   				showDialog(DIALOG_ABOUT);
   				return true;
   			case R.id.menuSalir:
   				finish();
   				return true;
   			default:
   				return super.onOptionsItemSelected(item);
   		}
   	}
   	
   	/**
   	 * Metodo que se muestra al abrir el dialogo
   	 * 
   	 * @param	id Identificador de la opcion de menu seleccionada
   	 * @return	El objeto Dialog creado
   	 */
   	@Override
   	protected Dialog onCreateDialog(int id) {
   		switch(id) {
   			case DIALOG_ABOUT:
   				AlertDialog dialogAbout = null;
   				final AlertDialog.Builder builder;
   				LayoutInflater li = LayoutInflater.from(this);
   				View view = li.inflate(R.layout.acerca_de, null);
   				builder = new AlertDialog.Builder(this).setIcon(R.drawable.icy_earth);
   				builder.setTitle(getString(R.string.app_name));
   				builder.setPositiveButton("Ok", null);
   				builder.setView(view);
   				dialogAbout = builder.create();
   				return dialogAbout;
   			default:
   				return null;
   		}
   	}
   	
   	/**
   	 * Metodo que se encarga de gestionar cuando se hace click en una localizacion
   	 * 
   	 * @param	l			El objeto ListView en el que se ha seleccionado un elemento
   	 * @param	position 	La posicion de la lista ocupada por el elemento seleccionado
   	 * @param	id			El identificador asociado a ese elemento en la lista
   	 */
   	@Override
   	protected void onListItemClick(ListView l, View v, int position, long id) {
   		//Creamos un intent para llamar a la activity que muestra la activity MostarLugarActivity
   		Intent intent = new Intent();
   		intent.setClass(getApplicationContext(), MostrarLugarActivity.class);
   		//casteamos el long con el id antes de meterlo en el bundle
   	    if (id < Integer.MIN_VALUE || id > Integer.MAX_VALUE) {
   	        throw new IllegalArgumentException("No se puede obtener el id de la localizacion a traves del id de la lista");
   	    }
   	    int identificador = (int)id;
   		intent.putExtra(Places._ID, identificador);
   		startActivity(intent);
   	}
   	
   	/**
   	 * Este método obtendrá los datos de la BD mediante una consulta
   	 * al proveedor de contenidos LocationsProvider, la cual devolverá
   	 * un objeto de tipo Cursor.
   	 */
   	private void configurarAdapter() {
		// Obtenemos todos los artículos de la BD
   		final String[] columnas = new String[] { Places._ID, Places.NAME, Places.DESC};
   		Uri uri = Uri.parse("content://finalapp.exercise.db.locationsprovider/location");
   		Cursor cursor = managedQuery(uri, columnas, null, null, Places.NAME);
   		
   		// Comprobamos si  han cambiado los datos para recargar el cursor
   		cursor.setNotificationUri(getContentResolver(), uri);
   		
   		// Para que la actividad se encargue de manejar el cursor segun sus ciclos de vida
   		startManagingCursor(cursor);
   		
   		// Mapeamos las Querys SQL a los campos de las vistas
   		String[] camposDB = new String[] { Places.NAME, Places.DESC};
   		int[] camposView = new int[] { R.id.localizacionNombre, R.id.localizacionDesc };
   		
   		// Creamos el adapter
   		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.localizacion_item, cursor, camposDB, camposView);
   		
   		// Todo listo, cargamos el adapter
   		setListAdapter(adapter);
	}
}
